/**
 * 系统初始化事件函数，负责执行一系列系统初始化操作
 */
async function systemInitializationEvent() {
	// 应用保存的主题样式
	applySavedTheme();
	// 异步加载保存的配置
	await loadSavedConfigs();
	// 加载语言设置
	loadLanguage();
	// 加载系统语音模型
	loadSystemSpeechModel();
	// 触发窗口大小调整事件
	windowResizeEvent();
	// 获取 Live2D 相关设置
	fetchLive2DSetting();
	// 创建 Live2D 状态选择器
	createLive2dStateSelect();
	// 延迟 250 毫秒后初始化 Live2D
	setTimeout(initLive2D, 250);
	// 异步加载配置
	await loadConfig();
	// 初始化 mermaid 图表
	mermaid.initialize(mermaidParameter);
	// 绑定滑块事件
	bindSlider();
	// 初始化自动调整大小的文本区域
	initAutoResizeTextareas();
	// 设置动态透明度
	dynamicOpacity();
	// 异步加载演示消息
	await loadDemoMessage();
	// 异步加载网页渲染内容
	await loadWebpageRendering('./bubble.html', simpleKnowledgePanel);
	// 异步加载简单知识页面到窗口中
	await loadPagesIntoWindow();
	// 异步加载网页渲染内容
	await loadWebpageRendering('./time.html', simpleRenderingPanel);
};

/**
 * 加载示例消息
 */
async function loadDemoMessage() {
	/**
	 * 获取演示消息
	 */
	const markdown = await fetchMarkdown('./prompt/demoMessage.md');
	/**
	 * 将演示消息以助手身份添加到消息面板中，但不加载进历史记录
	 */
	const assistantMsgObj = createMessageObject("assistant", markdown, false);
	/**
	 * 创建消息元素并渲染
	 */
	let messageElement = renderMessage(assistantMsgObj, chatHistoryPanel);
	// 为think区块添加折叠功能
	messageElement?.querySelectorAll(".toggle_think_button").forEach(bindFoldingButton);
};

/**
 * 加载简单知识页面到窗口中
 *
 * 该函数会获取 knowledge 目录下以 .page 结尾的文件，读取其内容并渲染到简单知识面板中
 *
 * @returns {Promise<void>}
 */
async function loadPagesIntoWindow() {
	/**
	 * 获取 knowledge 目录下的文件列表
	 */
	const response = await fetch('/files/knowledge');
	// 如果请求失败，直接返回
	if (!response.ok) return;
	/**
	 * 解析响应数据为 JSON 格式
	 */
	const files = await response.json();
	// 如果文件列表为空，直接返回
	if (!files || files.length === 0) return;
	/**
	 * 过滤出以 .page 结尾且不是目录的文件
	 */
	const pageFiles = files.filter(f => f.name.endsWith('.page') && !f.isDir);
	// 清空简单知识面板
	if (pageFiles.length > 0) simpleKnowledgePanel.innerHTML = "";
	// 遍历所有 .page 文件内容
	for (const file of pageFiles) {
		/**
		 * 读取单个 .page 文件的内容
		 */
		const response = await fetch(`/read/knowledge/${file.name}`);
		// 如果读取失败，跳过当前文件
		if (!response.ok) continue;
		/**
		 * 读取单个 .page 文件的内容
		 */
		const content = await response.text();
		// 如果文件内容为空，跳过当前文件
		if (!content.trim()) continue;
		// 渲染消息到简单知识面板
		console.log(JSON.parse(content).message.split("## 内容\n\n")[1]);
		renderMessage(createMessageObject("assistant", JSON.parse(content).message.split("## 内容\n\n")[1], false, true, false, null, `knowledge/${file.name}`), simpleKnowledgePanel);
		// 将当前文件名添加到已完成下载历史记录中，避免重复处理
		completeDownloadHistory.add(file.name);
	}
	// 连接嵌入端点，加载页面内容到向量数据库
	await embeddingEndpointConnection();
};

/**
 * 加载网页渲染内容
 *
 * @param {string} url - 要加载的网页 URL
 *
 * @param {HTMLElement} container - 用于渲染消息元素的容器元素
 *
 * @returns {Promise<void>}
 */
async function loadWebpageRendering(url, container) {
	/**
	 * 获取演示消息
	 */
	const html = await fetchMarkdown(url);
	/**
	 * 创建一个用户消息对象，用于渲染消息元素
	 */
	const userMsgObj = createMessageObject("user", '', false, true);
	/**
	 * 渲染消息元素
	 */
	const messageElement = renderMessage(userMsgObj, container);
	/**
	 * 创建一个 iframe 元素，用于显示代码块内容
	 */
	const iframe = document.createElement('iframe');
	// 设置 iframe 的样式，使其填满父元素
	iframe.style.cssText = 'width:100%; height:100%; border:0';
	// 将代码块的文本内容设置为 iframe 的文档内容
	iframe.srcdoc = html;
	// 设置 iframe 的沙箱属性，允许脚本执行
	iframe.sandbox = 'allow-modals allow-forms allow-popups allow-scripts';
	// 清空消息元素的内容
	messageElement.innerHTML = '';
	// 将 iframe 添加到消息元素中
	messageElement.appendChild(iframe);
	// 设置消息元素的高度为 100%
	messageElement.style.height = '100%';
	// 设置消息元素的最小高度
	messageElement.style.minHeight = 'calc(100vh - 500px)';
};